#pragma once

namespace Zen
{
#define ASCII_DEFINE(Name, value) constexpr char Name = value
	namespace Ascii
	{
		ASCII_DEFINE(Null, 0);
		ASCII_DEFINE(SOH, 1); // start of head
		ASCII_DEFINE(STX, 2); // start of text
		ASCII_DEFINE(ETX, 3); // end of text
		ASCII_DEFINE(EOT, 4); // end of transmission
		ASCII_DEFINE(Enq, 5); // enquiry
		ASCII_DEFINE(Ack, 6); // ack
		ASCII_DEFINE(Bell, 7); // bell
		ASCII_DEFINE(Backspace, 8);
		ASCII_DEFINE(Tab, 9);
		ASCII_DEFINE(NewLine, 0x0A); // \n
		ASCII_DEFINE(VTab, 0x0B); // vertical tab
		ASCII_DEFINE(NewPage, 0x0C);
		ASCII_DEFINE(Return, 0x0D); // \r
		ASCII_DEFINE(ShiftOut, 0x0E);
		ASCII_DEFINE(ShiftIn, 0x0F);

		ASCII_DEFINE(DLEsc, 0x10); // data link escape
		ASCII_DEFINE(DC1, 0x11); // data control
		ASCII_DEFINE(DC2, 0x12);
		ASCII_DEFINE(DC3, 0x13);
		ASCII_DEFINE(DC4, 0x14);
		ASCII_DEFINE(NegAck, 0x15);
		ASCII_DEFINE(Sync, 0x16);
		ASCII_DEFINE(ETB, 0x17); // end of trans. block
		ASCII_DEFINE(Cancel, 0x18);
		ASCII_DEFINE(EOM, 0x19); // end of medium
		ASCII_DEFINE(Sub, 0x1A); // substitute
		ASCII_DEFINE(Escape, 0x1B);
		ASCII_DEFINE(X1C, 0x1C); // file sep
		ASCII_DEFINE(X1D, 0x1D); // group sep
		ASCII_DEFINE(X1E, 0x1E); // record sep
		ASCII_DEFINE(X1F, 0x1F); // unit sep

		ASCII_DEFINE(Space, 0x20);
		ASCII_DEFINE(Bang, 0x21); // !
		ASCII_DEFINE(DoubleQuote, 0x22); // "
		ASCII_DEFINE(Sharp, 0x23); // #
		ASCII_DEFINE(Dollar, 0x24); // $
		ASCII_DEFINE(Percent, 0x25); // %
		ASCII_DEFINE(And, 0x26); // &
		ASCII_DEFINE(Quote, 0x27); // '
		ASCII_DEFINE(ParenL, 0x28); // (
		ASCII_DEFINE(ParenR, 0x29); // )
		ASCII_DEFINE(Asterisk, 0x2A); // *
		ASCII_DEFINE(Plus, 0x2B); // +
		ASCII_DEFINE(Comma, 0x2C); // ,
		ASCII_DEFINE(Minus, 0x2D); // -
		ASCII_DEFINE(Dot, 0x2E); // .
		ASCII_DEFINE(Slash, 0x2F); // /

		ASCII_DEFINE(Num0, 0x30);
		ASCII_DEFINE(Num1, 0x31);
		ASCII_DEFINE(Num2, 0x32);
		ASCII_DEFINE(Num3, 0x33);
		ASCII_DEFINE(Num4, 0x34);
		ASCII_DEFINE(Num5, 0x35);
		ASCII_DEFINE(Num6, 0x36);
		ASCII_DEFINE(Num7, 0x37);
		ASCII_DEFINE(Num8, 0x38);
		ASCII_DEFINE(Num9, 0x39);
		ASCII_DEFINE(Colon, 0x3A); // :
		ASCII_DEFINE(Semi, 0x3B); // ;
		ASCII_DEFINE(Less, 0x3C); // <
		ASCII_DEFINE(Equal, 0x3D); // =
		ASCII_DEFINE(Greater, 0x3E); // >
		ASCII_DEFINE(Question, 0x3F); // ?

		ASCII_DEFINE(At, 0x40); // @
		ASCII_DEFINE(CapA, 0x41);
		ASCII_DEFINE(CapB, 0x42);
		ASCII_DEFINE(CapC, 0x43);
		ASCII_DEFINE(CapD, 0x44);
		ASCII_DEFINE(CapE, 0x45);
		ASCII_DEFINE(CapF, 0x46);
		ASCII_DEFINE(CapG, 0x47);
		ASCII_DEFINE(CapH, 0x48);
		ASCII_DEFINE(CapI, 0x49);
		ASCII_DEFINE(CapJ, 0x4a);
		ASCII_DEFINE(CapK, 0x4b);
		ASCII_DEFINE(CapL, 0x4c);
		ASCII_DEFINE(CapM, 0x4d);
		ASCII_DEFINE(CapN, 0x4e);
		ASCII_DEFINE(CapO, 0x4f);

		ASCII_DEFINE(CapP, 0x50);
		ASCII_DEFINE(CapQ, 0x51);
		ASCII_DEFINE(CapR, 0x52);
		ASCII_DEFINE(CapS, 0x53);
		ASCII_DEFINE(CapT, 0x54);
		ASCII_DEFINE(CapU, 0x55);
		ASCII_DEFINE(CapV, 0x56);
		ASCII_DEFINE(CapW, 0x57);
		ASCII_DEFINE(CapX, 0x58);
		ASCII_DEFINE(CapY, 0x59);
		ASCII_DEFINE(CapZ, 0x5a);
		ASCII_DEFINE(BracketL, 0x5B); // [
		ASCII_DEFINE(BackSlash, 0x5C); //'\'
		ASCII_DEFINE(BracketR, 0x5D); // ]
		ASCII_DEFINE(Caret, 0x5E); // ^
		ASCII_DEFINE(Underscore, 0x5F); // _

		ASCII_DEFINE(Backquote, 60); // `
		ASCII_DEFINE(LowerA, 0x61);
		ASCII_DEFINE(LowerB, 0x62);
		ASCII_DEFINE(LowerC, 0x63);
		ASCII_DEFINE(LowerD, 0x64);
		ASCII_DEFINE(LowerE, 0x65);
		ASCII_DEFINE(LowerF, 0x66);
		ASCII_DEFINE(LowerG, 0x67);
		ASCII_DEFINE(LowerH, 0x68);
		ASCII_DEFINE(LowerI, 0x69);
		ASCII_DEFINE(LowerJ, 0x6a);
		ASCII_DEFINE(LowerK, 0x6b);
		ASCII_DEFINE(LowerL, 0x6c);
		ASCII_DEFINE(LowerM, 0x6d);
		ASCII_DEFINE(LowerN, 0x6e);
		ASCII_DEFINE(LowerO, 0x6f);

		ASCII_DEFINE(LowerP, 0x70);
		ASCII_DEFINE(LowerQ, 0x71);
		ASCII_DEFINE(LowerR, 0x72);
		ASCII_DEFINE(LowerS, 0x73);
		ASCII_DEFINE(LowerT, 0x74);
		ASCII_DEFINE(LowerU, 0x75);
		ASCII_DEFINE(LowerV, 0x76);
		ASCII_DEFINE(LowerW, 0x77);
		ASCII_DEFINE(LowerX, 0x78);
		ASCII_DEFINE(LowerY, 0x79);
		ASCII_DEFINE(LowerZ, 0x7A);
		ASCII_DEFINE(BraceL, 0x7B); // {
		ASCII_DEFINE(Pipe, 0x7C); // |
		ASCII_DEFINE(BraceR, 0x7D); // }
		ASCII_DEFINE(Tilde, 0x7E); // ~
		ASCII_DEFINE(Del, 0x7F);
	} // namespace Ascii
} // namespace Zen
